#include "ThreadPool.h"
#include <chrono>

int main(int argc, char const *argv[])
{
    ThreadPool pool(2); //创建对象，创建并启动两个线程，线程内容为两个变量控制的死循环

    //创建线程用于向线程池中添加任务
    std::thread thd1([&pool]
                     {
                         for (size_t i = 0; i < 10; i++)
                         {
                             std::cout << "添加任务之前 \n";
                             auto thdId = std::this_thread::get_id();
                             pool.AddTask([thdId]
                                          {
                                              std::cout << "执行任务 :  同步层线程1 的线程ID： " << thdId << "\n";
                                              std::this_thread::sleep_for(std::chrono::microseconds(100));
                                          });
                         }
                     });

    std::thread thd2([&pool]
                     {
                         for (size_t i = 0; i < 10; i++)
                         {
                             std::cout << "添加任务之前\n";
                             auto thdId = std::this_thread::get_id();
                             pool.AddTask([thdId]
                                          { std::cout << "执行任务 ： 同步层线程2 的线程ID： " << thdId << "\n"; });
                         }
                     });

    std::this_thread::sleep_for(std::chrono::seconds(2));
    // getchar();
    pool.Stop();

    thd1.join();
    thd2.join();
    return 0;
}

/**
 * @brief 使用C++11 的线程、条件变量、互斥量、原子变量 可以实现一个轻巧的线程池，从而避免频繁地创建线程。使用线程池要注意一些问题：
    * 保证线程池中的任务不能挂死，否则会耗尽线程池中的线程，造成假死现象
    * 还要避免长时间去执行一个任务，会导致后面的任务大量堆积而得不到及时处理，对于耗时较长的任务可以考虑用单独的线程去处理
 * 
 */
